/* servidor_vc.c - Programa que implementa um servidor de variável condição,
 * utilizando FIFOs para a troca de mensagens e para testar sua
 * funcionalidade.
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#define MAX_CLIENTES 10
#define MAX_BUF 15

int main(void)
{
	int i = 0, x;
	char str[MAX_BUF], *fifo, *comando;

	int clientes[MAX_CLIENTES], recebe_fd;
	memset(clientes, 0, MAX_CLIENTES);

	mkfifo("receive", 0666);
	recebe_fd = open("receive", 0);

	for (;;) {
		if(!read(recebe_fd, str, MAX_BUF))
			continue;
		comando = strtok(str, " ");
		fifo = strtok(NULL, " ");

		if (!strcmp(comando, "wait")) {
			printf("Recebeu comando = wait do processo %s\n", fifo);
			clientes[i++] = open(fifo, 1);
			
		} else if (!strcmp(comando, "signal")) {
			printf("Recebeu comando = signal\n");
			if (i > 0) {
				write(clientes[0], "Ok\0", 3);

				// Reordena clientes 
				for (x = 0; x <= i; x++) {
					clientes[x] = clientes[x + 1];
				}
				i--;
			}

		} else if (!strcmp(comando, "broadcast")) {
			printf("Recebeu comando = broadcast\n");
			for (x = 0; x < i; x++)
				write(clientes[x], "Ok\0", 3);
			i = 0;
		}

	}
}
